From 28e7d3c14880c27591b19f5edc2a6c5b924c14c1 Mon Sep 17 00:00:00 2001 From: Carlos Garnacho Date: Mon, 27 Feb 2012 13:09:59 +0100 Subject: [PATCH] gdk: Get the right event window for pointer emulated events get_event_window() just checked on GDK_TOUCH_MASK, including for emulated pointer events, so at the very least those should also match evmasks with no touch events whatsoever --- gdk/gdkwindow.c | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 43721fcf20..7a84aee90a 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -9139,9 +9139,10 @@ get_event_window (GdkDisplay *display, GdkEventType type, GdkModifierType mask, guint *evmask_out, + gboolean pointer_emulated, gulong serial) { - guint evmask; + guint evmask, emulated_mask = 0; GdkWindow *grab_window; GdkDeviceGrabInfo *grab; GdkTouchGrabInfo *touch_grab; @@ -9149,13 +9150,30 @@ get_event_window (GdkDisplay *display, touch_grab = _gdk_display_has_touch_grab (display, device, sequence, serial); grab = _gdk_display_get_last_device_grab (display, device); + if (is_touch_type (type) && pointer_emulated) + { + switch (type) + { + case GDK_TOUCH_BEGIN: + emulated_mask |= GDK_BUTTON_PRESS_MASK; + break; + case GDK_TOUCH_UPDATE: + emulated_mask |= GDK_BUTTON_MOTION_MASK; + break; + case GDK_TOUCH_END: + emulated_mask |= GDK_BUTTON_RELEASE_MASK; + default: + break; + } + } + if (touch_grab != NULL && (!grab || grab->implicit || touch_grab->serial >= grab->serial_start)) { evmask = touch_grab->event_mask; evmask = update_evmask_for_button_motion (evmask, mask); - if (evmask & type_masks[type]) + if (evmask & (type_masks[type] | emulated_mask)) { if (evmask_out) *evmask_out = evmask; @@ -9172,7 +9190,7 @@ get_event_window (GdkDisplay *display, grab_window = grab->window; - if (evmask & type_masks[type]) + if (evmask & (type_masks[type] | emulated_mask)) { if (evmask_out) *evmask_out = evmask; @@ -9187,7 +9205,7 @@ get_event_window (GdkDisplay *display, evmask = pointer_window->event_mask; evmask = update_evmask_for_button_motion (evmask, mask); - if (evmask & type_masks[type]) + if (evmask & (type_masks[type] | emulated_mask)) { if (evmask_out) *evmask_out = evmask; @@ -9203,7 +9221,7 @@ get_event_window (GdkDisplay *display, evmask = grab->event_mask; evmask = update_evmask_for_button_motion (evmask, mask); - if (evmask & type_masks[type]) + if (evmask & (type_masks[type] | emulated_mask)) { if (evmask_out) *evmask_out = evmask; @@ -9384,6 +9402,7 @@ proxy_pointer_event (GdkDisplay *display, source_event->type, state, &evmask, + _gdk_event_get_pointer_emulated (source_event), serial); if (event_type == GDK_TOUCH_UPDATE) @@ -9620,7 +9639,9 @@ proxy_button_event (GdkEvent *source_event, sequence, pointer_window, type, state, - &evmask, serial); + &evmask, + _gdk_event_get_pointer_emulated (source_event), + serial); if (type == GDK_TOUCH_BEGIN || type == GDK_TOUCH_END) { -- 2.30.2